package co.com.travelsoft.ati.administrador;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.Reference;

import co.com.travelsoft.ati.administrador.utils.RecursosUtil;
import co.com.travelsoft.ati.dto.CiudadDto;
import co.com.travelsoft.ati.dto.UsuarioDto;
import co.com.travelsoft.ati.entities.EventoDto;
import co.com.travelsoft.ati.entities.TipoEventoDto;
import co.com.travelsoft.ati.dto.PaisDto;
import co.com.travelsoft.ati.entities.ejb.EventoEJBRemote;
import co.com.travelsoft.ati.entities.ejb.UsuarioEJBRemote;
import co.com.travelsoft.ati.exception.TravelSoftException;

public class DelegadoNegocio {
	
	private static final String TRAVEL_SOFT_EJB_USUARIO_EJB_REMOTE = "TravelSoftEAR/UsuarioEJB/remote";
	
	private static final String TRAVEL_SOFT_EJB_EVENTO_EJB_REMOTE = "TravelSoftEAR/EventoEJB/remote";
	
	private static InitialContext ctx = null;

	private static DelegadoNegocio instance;

	private DelegadoNegocio() {
		try {
			ctx = RecursosUtil.getContextoInicial();
		} catch (NamingException e) {
			e.printStackTrace();
		}

	}

	public static DelegadoNegocio getInstancia() {
		if (instance == null) {
			instance = new DelegadoNegocio();
		}

		return instance;
	}
	
	
	public void eliminarUsuario(BigDecimal idUsuario) throws TravelSoftException{
		try {
			UsuarioEJBRemote usuarioEJB = (UsuarioEJBRemote) ctx.lookup(TRAVEL_SOFT_EJB_USUARIO_EJB_REMOTE);
			UsuarioDto usuario = new UsuarioDto();
			usuario.setCodigo(idUsuario);
			usuarioEJB.borrar(usuario);
		} catch (NamingException e) {
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} catch (TravelSoftException e) {
			throw e;
		}
	}
	
	public List<EventoDto> consultarEventos() throws TravelSoftException{
		List<EventoDto> eventos = new ArrayList<EventoDto>();
		
		try {
			EventoEJBRemote eventoEJB = (EventoEJBRemote) ctx.lookup(TRAVEL_SOFT_EJB_EVENTO_EJB_REMOTE);
			eventos = eventoEJB.listarEventoDto();
			
		} catch (NamingException e) {
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} 
		
		return eventos;
	}
	
	public List<PaisDto> listarPaises() throws TravelSoftException{
		List<PaisDto> eventos = new ArrayList<PaisDto>();
		
		try {
			EventoEJBRemote eventoEJB = (EventoEJBRemote) ctx.lookup(TRAVEL_SOFT_EJB_EVENTO_EJB_REMOTE);
			eventos = eventoEJB.listarPaises();
			
		} catch (NamingException e) {
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} 
		
		return eventos;
	}
	
	public List<TipoEventoDto> listarTiposEventos() throws TravelSoftException{
		List<TipoEventoDto> tiposEventos = new ArrayList<TipoEventoDto>();
		
		try {
			EventoEJBRemote eventoEJB = (EventoEJBRemote) ctx.lookup(TRAVEL_SOFT_EJB_EVENTO_EJB_REMOTE);
			tiposEventos = eventoEJB.listarTiposEvento();
			
		} catch (NamingException e) {
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} 
		
		return tiposEventos;
	}
	
	public List<CiudadDto> listarCiudadesDePais() throws TravelSoftException{
		List<CiudadDto> eventos = new ArrayList<CiudadDto>();
		
		try {
			EventoEJBRemote eventoEJB = (EventoEJBRemote) ctx.lookup(TRAVEL_SOFT_EJB_EVENTO_EJB_REMOTE);
			eventos = eventoEJB.listarCiudades();
			
		} catch (NamingException e) {
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} 
		
		return eventos;
	}
	
	public void crearEvento(EventoDto evento) throws TravelSoftException{
		try {
			EventoEJBRemote eventoEJB = (EventoEJBRemote) ctx.lookup(TRAVEL_SOFT_EJB_EVENTO_EJB_REMOTE);
			eventoEJB.crearEventoDto(evento);
		} catch (NamingException e) {
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} catch (TravelSoftException e) {
			throw e;
		}
	}
	
	public void modificarEvento(EventoDto evento) throws TravelSoftException{
		try {
			EventoEJBRemote eventoEJB = (EventoEJBRemote) ctx.lookup(TRAVEL_SOFT_EJB_EVENTO_EJB_REMOTE);
			eventoEJB.actualizarEventoDto(evento);
		} catch (NamingException e) {
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} catch (TravelSoftException e) {
			throw e;
		}
	}
	
	public void eliminarEvento(EventoDto evento) throws TravelSoftException{
		try {
			EventoEJBRemote eventoEJB = (EventoEJBRemote) ctx.lookup(TRAVEL_SOFT_EJB_EVENTO_EJB_REMOTE);
			eventoEJB.borrarEventoDto(evento);
		} catch (NamingException e) {
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} catch (TravelSoftException e) {
			throw e;
		}
	}
	
	public List<UsuarioDto> consultarUsuariosInactivos() throws TravelSoftException{
		List<UsuarioDto> usuarios = new ArrayList<UsuarioDto>();
		
		try {
			UsuarioEJBRemote usuarioEJB = (UsuarioEJBRemote)  ctx.lookup(TRAVEL_SOFT_EJB_USUARIO_EJB_REMOTE);
			usuarios = usuarioEJB.consultarUsuariosInactivos(1);
			
		} catch (NamingException e) {
			e.printStackTrace();
			throw new TravelSoftException("No hay acceso a los servicios remotos");
		} 
		
		return usuarios;
	}
 	
}
